﻿Перем юТест;

Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
	
	юТест = ЮнитТестирование;
	
	ВсеТесты = Новый Массив;
	
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСтандартно");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСтандартноСПеречислениемКодировкаТекста");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСПеречислениемКодировкаТекста");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоНеоткрытыйФайлБросаетПравильноеИсключениеВМетодеЗаписать");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоНеоткрытыйФайлБросаетПравильноеИсключениеВМетодеЗаписатьСтроку");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоРаботаетКонструкторПоИмениФайлаСНезаполненнымиНеобязательнымиПолями");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоЗаписьСтрокиВФайлПроисходитСразуБезКеширования");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуРазделителей");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуНеобычныхРазделителей1");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуНеобычныхРазделителей2");
	ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуНеобычныхРазделителей3");
	ВсеТесты.Добавить("ТестДолжен_ПрочитатьИзФайлаСРазнымиПереводамиСтрок");
	
	Возврат ВсеТесты;
	
КонецФункции

Процедура ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСтандартно() Экспорт
	
	Путь = ПолучитьИмяВременногоФайла("txt");
	ЗТ = Новый ЗаписьТекста(Путь, "windows-1251"); 
	ЗТ.Закрыть(); 
	ЗТ = Новый ЗаписьТекста(Путь,"UTF-8",,Истина);
	ЗТ.Записать("Привет");
	ЗТ.Закрыть();
	
	Файл = Новый Файл(Путь);
	
	Попытка
		юТест.ПроверитьРавенство(12, Файл.Размер());
	Исключение
		УдалитьФайлы(Путь);
		ВызватьИсключение;
	КонецПопытки;
	
	УдалитьФайлы(Путь);
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСтандартноСПеречислениемКодировкаТекста() Экспорт
	
	Путь = ПолучитьИмяВременногоФайла("txt");
	ЗТ = Новый ЗаписьТекста(Путь, КодировкаТекста.ANSI); 
	ЗТ.Закрыть(); 
	ЗТ = Новый ЗаписьТекста(Путь,КодировкаТекста.UTF8,,Истина);
	ЗТ.Записать("Привет");
	ЗТ.Закрыть();
	
	Файл = Новый Файл(Путь);
	
	Попытка
		юТест.ПроверитьРавенство(12, Файл.Размер());
	Исключение
		УдалитьФайлы(Путь);
		ВызватьИсключение;
	КонецПопытки;
	
	УдалитьФайлы(Путь);
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоВозможнаЗаписьUTF8БезBOMСПеречислениемКодировкаТекста() Экспорт
	
	Путь = ПолучитьИмяВременногоФайла("txt");
	ЗТ = Новый ЗаписьТекста(Путь,КодировкаТекста.UTF8NoBOM);
	ЗТ.Записать("Привет");
	ЗТ.Закрыть();
	
	Файл = Новый Файл(Путь);
	
	Попытка
		юТест.ПроверитьРавенство(12, Файл.Размер());
	Исключение
		УдалитьФайлы(Путь);
		ВызватьИсключение;
	КонецПопытки;
	
	УдалитьФайлы(Путь);
	
КонецПроцедуры


Процедура ТестДолжен_ПроверитьЧтоНеоткрытыйФайлБросаетПравильноеИсключениеВМетодеЗаписать() Экспорт
	
	Запись = Новый ЗаписьТекста();
	
	Попытка
		Запись.Записать("---");
	Исключение
		юТест.ПроверитьРавенство(ИнформацияОбОшибке().Описание, "Файл не открыт", "Метод Записать должен бросать правильное исключение");
		Возврат;
	КонецПопытки;
	
	ВызватьИсключение "Не было брошено исключение";
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоНеоткрытыйФайлБросаетПравильноеИсключениеВМетодеЗаписатьСтроку() Экспорт
	
	Запись = Новый ЗаписьТекста();
	
	Попытка
		Запись.ЗаписатьСтроку("---");
	Исключение
		юТест.ПроверитьРавенство(ИнформацияОбОшибке().Описание, "Файл не открыт", "Метод ЗаписатьСтроку должен бросать правильное исключение");
		Возврат;
	КонецПопытки;
	
	ВызватьИсключение "Не было брошено исключение";
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоРаботаетКонструкторПоИмениФайлаСНезаполненнымиНеобязательнымиПолями() Экспорт

	Перем ИмяФайла, Запись;

	ИмяФайла = ПолучитьИмяВременногоФайла("txt");

	Попытка
		Запись = Новый ЗаписьТекста(ИмяФайла);
	Исключение
		ВызватьИсключение "Не работает конструктор ЗаписьТекста(ИмяФайла,,,)";
	КонецПопытки;
	Запись.Закрыть();

	Попытка
		Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
	Исключение
		ВызватьИсключение "Не работает конструктор ЗаписьТекста(ИмяФайла, Кодировка,,)";
	КонецПопытки;
	Запись.Закрыть();
	
	Попытка
		Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI, Символы.ПС);
	Исключение
		ВызватьИсключение "Не работает конструктор ЗаписьТекста(ИмяФайла, Кодировка, ПереводСтрок,)";
	КонецПопытки;
	Запись.Закрыть();
	
КонецПроцедуры

Процедура ТестДолжен_ПроверитьЧтоЗаписьСтрокиВФайлПроисходитСразуБезКеширования() Экспорт
	Перем ИмяФайла, Запись;

	ИмяФайла = ПолучитьИмяВременногоФайла("txt");

	СтрокаДляФайла = "---";
	Запись = Новый ЗаписьТекста(ИмяФайла);

	Запись.Записать(СтрокаДляФайла);

	Файл = Новый Файл(ИмяФайла);
	
	Попытка
		юТест.ПроверитьРавенство(6, Файл.Размер());
	Исключение
		Запись.Закрыть();
		УдалитьФайлы(ИмяФайла);
		ВызватьИсключение;
	КонецПопытки;
	
	Запись.Закрыть();
	УдалитьФайлы(ИмяФайла);

КонецПроцедуры

Функция ЭкранироватьПереносыСтрок(Знач Строка1)

	Возврат СтрЗаменить(СтрЗаменить(Строка1, Символы.ПС, "<LF>"), Символы.ВК, "<CR>");

КонецФункции

Процедура ПодробноеСравнениеСтрок(Знач Строка1, Знач Строка2, Знач ТекстСообщения)

	Если Строка1 = Строка2 Тогда
		Возврат;
	КонецЕсли;

	Строка1 = ЭкранироватьПереносыСтрок(Строка1);
	Строка2 = ЭкранироватьПереносыСтрок(Строка2);

	юТест.ПроверитьРавенство(Строка1, Строка2, ТекстСообщения);

КонецПроцедуры

Процедура ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(Знач Текст, Знач РазделительСтрокВФайле, Знач НаименованиеТеста)

	ИмяФайла = ПолучитьИмяВременногоФайла("txt");
	Запись = Новый ЗаписьТекста;
	Запись.Открыть(ИмяФайла, "UTF-8", Символы.ПС, Ложь, РазделительСтрокВФайле);
	Запись.Записать(Текст);
	Запись.Закрыть();

	Чтение = Новый ЧтениеТекста;
	Чтение.Открыть(ИмяФайла, "UTF-8", Символы.ПС, РазделительСтрокВФайле);

	ПроверяемыйТекст = Чтение.Прочитать();

	ПодробноеСравнениеСтрок(ПроверяемыйТекст, Текст, "Не сработало запись-чтение текста (" + НаименованиеТеста + ")");

КонецПроцедуры

Процедура ТестДолжен_ПроверитьРаботуРазделителей() Экспорт

	ТекстДляПроверки = "1
		|2
		|3"
	;

	ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ПС, "ПС");
	ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ВК + Символы.ПС, "ВК+ПС");
	ПроверитьЗаписьТекстаСРазделителемСтрокВФайле(ТекстДляПроверки, Символы.ВК, "ВК");

КонецПроцедуры

Процедура ТестДолжен_ПроверитьРаботуНеобычныхРазделителей1() Экспорт

	ИмяФайла = ПолучитьИмяВременногоФайла("txt");
	Запись = Новый ЗаписьТекста;
	Запись.Открыть(ИмяФайла, , "/");
	Запись.ЗаписатьСтроку("123");
	Запись.ЗаписатьСтроку("123
		|456
		|789"
	);

	Запись.Закрыть();

	Чтение = Новый ЧтениеТекста;
	Чтение.Открыть(ИмяФайла);

	юТест.ПроверитьРавенство(Чтение.ПрочитатьСтроку(), "123/123", "Запись строки с разделителем /");
	юТест.ПроверитьРавенство(Чтение.ПрочитатьСтроку(), "456", "Запись строки с разделителем /");
	юТест.ПроверитьРавенство(Чтение.ПрочитатьСтроку(), "789/", "Запись строки с разделителем /");

КонецПроцедуры

Процедура ТестДолжен_ПроверитьРаботуНеобычныхРазделителей2() Экспорт

	ИмяФайла = ПолучитьИмяВременногоФайла("txt");
	Запись = Новый ЗаписьТекста;
	Запись.Открыть(ИмяФайла, , , , "/");
	Запись.ЗаписатьСтроку("123");
	Запись.ЗаписатьСтроку("123
		|456
		|789"
	);

	Запись.Закрыть();

	Чтение = Новый ЧтениеТекста;
	Чтение.Открыть(ИмяФайла);

	юТест.ПроверитьРавенство(Чтение.ПрочитатьСтроку(), "123/123/456/789/", "Запись строки с разделителем в файле /");
	юТест.ПроверитьРавенство(Чтение.ПрочитатьСтроку(), Неопределено, "Запись строки с разделителем в файле /");

КонецПроцедуры

Процедура ТестДолжен_ПроверитьРаботуНеобычныхРазделителей3() Экспорт

	ИмяФайла = ПолучитьИмяВременногоФайла("txt");
	Запись = Новый ЗаписьТекста;
	Запись.Открыть(ИмяФайла, , "-", , "/");
	Запись.ЗаписатьСтроку("123");
	Запись.ЗаписатьСтроку("123
		|456
		|789"
	);

	Запись.Закрыть();

	Чтение = Новый ЧтениеТекста;
	Чтение.Открыть(ИмяФайла);

	юТест.ПроверитьРавенство(Чтение.ПрочитатьСтроку(), "123-123/456/789-", "Запись строки с разделителем в файле /");
	юТест.ПроверитьРавенство(Чтение.ПрочитатьСтроку(), Неопределено, "Запись строки с разделителем в файле /");

КонецПроцедуры

Функция КаталогИсходников()

	Файл = Новый Файл(ТекущийСценарий().Источник);
	Возврат Файл.Путь;

КонецФункции

Процедура ТестДолжен_ПрочитатьИзФайлаСРазнымиПереводамиСтрок() Экспорт

	ПутьФайла = КаталогИсходников() + "/testdata/ObjectModule.txt";

	Текст = Новый ЧтениеТекста;
	Текст.Открыть(ПутьФайла,"UTF-8");
	КоличествоСтрок = 0;
	Пока Истина Цикл
		Стр = Текст.ПрочитатьСтроку();
		Если Стр = Неопределено Тогда
			Прервать;
		КонецЕсли;
		КоличествоСтрок = КоличествоСтрок + 1;
	КонецЦикла;
	Текст.Открыть(ПутьФайла,"UTF-8");
	Стр = Текст.Прочитать();

	юТест.ПроверитьРавенство(6, КоличествоСтрок);
	юТест.ПроверитьРавенство(125, СтрДлина(Стр));

КонецПроцедуры
